package com.shanzhu.dormitory.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.shanzhu.dormitory.common.R;
import com.shanzhu.dormitory.entity.DormBuild;
import com.shanzhu.dormitory.service.DormBuildService;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 管理员用户 控制层
 *
 * @author: ShanZhu
 * @date: 2024-01-07
 */
@RestController
@RequestMapping("/building")
public class DormBuildController {

    @Resource
    private DormBuildService dormBuildService;

    /**
     * 楼宇添加
     */
    @PostMapping("/add")
    public R<?> add(@RequestBody DormBuild dormBuild) {
        int i = dormBuildService.addNewBuilding(dormBuild);
        if (i == 1) {
            return R.success();
        } else {
            return R.error("-1", "添加失败");
        }
    }

    /**
     * 楼宇信息更新
     */
    @PutMapping("/update")
    public R<?> update(@RequestBody DormBuild dormBuild) {
        int i = dormBuildService.updateNewBuilding(dormBuild);
        if (i == 1) {
            return R.success();
        } else {
            return R.error("-1", "更新失败");
        }
    }

    /**
     * 楼宇删除
     */
    @DeleteMapping("/delete/{dormBuildId}")
    public R<?> delete(@PathVariable Integer dormBuildId) {
        int i = dormBuildService.deleteBuilding(dormBuildId);
        if (i == 1) {
            return R.success();
        } else {
            return R.error("-1", "删除失败");
        }
    }

    /**
     * 楼宇查找
     */
    @GetMapping("/find")
    public R<?> findPage(@RequestParam(defaultValue = "1") Integer pageNum,
                         @RequestParam(defaultValue = "10") Integer pageSize,
                         @RequestParam(defaultValue = "") String search) {
        Page page = dormBuildService.find(pageNum, pageSize, search);
        if (page != null) {
            return R.success(page);
        } else {
            return R.error("-1", "查询失败");
        }
    }

    /**
     * 首页Echarts 获取楼宇信息
     */
    @GetMapping("/getBuildingName")
    public R<?> getBuildingName() {
        // 日志记录
        log.info("开始查询宿舍楼ID列表");

        try {
            // 获取宿舍楼信息列表
            List<DormBuild> dormBuildList = dormBuildService.getBuildingId();

            // 防御性编程：检查service返回值是否为空
            if (dormBuildList == null) {
                log.warn("dormBuildService.getBuildingId() 返回null");
                return R.error("500", "系统内部错误");
            }

            // 提取ID列表
            List<Integer> buildingIdList = dormBuildList.stream()
                    .filter(Objects::nonNull) // 过滤可能存在的null元素
                    .map(DormBuild::getDormBuildId)
                    .filter(Objects::nonNull) // 过滤可能存在的null ID
                    .collect(Collectors.toList());

            // 业务逻辑验证：检查是否有数据
            if (buildingIdList.isEmpty()) {
                log.info("未查询到宿舍楼数据");
                return R.success(Collections.emptyList()); // 返回空列表而不是错误
            }

            // 返回成功结果
            log.info("成功查询到 {} 条宿舍楼数据", buildingIdList.size());
            return R.success(buildingIdList);

        } catch (Exception e) {
            // 统一异常处理
            log.error("查询宿舍楼ID列表失败", e);
            return R.error("500", "查询宿舍楼信息失败，请稍后重试");
        }
    }
}
